﻿/**
 * Object相关操作
 * @namespace Object
 * @name core.Object
 * @static
 */
core.Object = {
  /**
   * 判断一个变量是否undefined
   * @name core.Object.isUndefined
   * @function
   * @grammar core.Object.isUndefined(object)
   * @param {Any} object 要判断的变量名称
   *
   * @returns {Boolean} 判断结果
   */
  isUndefined: function (object) {
    return typeof object == 'undefined';
  },
  /**
   * 判断一个变量是否布尔类型
   * @name core.Object.isBoolean
   * @function
   * @grammar core.Object.isBoolean(object)
   * @param {Any} object 要判断的变量名称
   *
   * @returns {Boolean} 判断结果
   */
  isBoolean: function (object) {
    return typeof object == 'boolean';
  },
  /**
   * 判断一个变量是否字符串类型
   * @name core.Object.isString
   * @function
   * @grammar core.Object.isString(object)
   * @param {Any} object 要判断的变量名称
   *
   * @returns {Boolean} 判断结果
   */
  isString: function (object) {
    return typeof object == 'string';
  },
  /**
   * 判断一个变量是否页面文档TAG节点类型
   * @name core.Object.isElement
   * @function
   * @grammar core.Object.isElement(object)
   * @param {Any} object 要判断的变量名称
   *
   * @returns {Boolean} 判断结果
   */
  isElement: function (object) {
    return object && object.nodeType == 1;
  },
  /**
   * 判断一个变量是否函数类型
   * @name core.Object.isFunction
   * @function
   * @grammar core.Object.isFunction(object)
   * @param {Any} object 要判断的变量名称
   *
   * @returns {Boolean} 判断结果
   */
  isFunction: function (object) {
    return typeof object == 'function';
  },
  /**
   * 判断一个变量是否object类型
   * @name core.Object.isObject
   * @function
   * @grammar core.Object.isObject(object)
   * @param {Any} object 要判断的变量名称
   *
   * @returns {Boolean} 判断结果
   */
  isObject: function (object) {
    return typeof object == 'object';
  },
  /**
   * 判断一个变量是否数组类型
   * @name core.Object.isArray
   * @function
   * @grammar core.Object.isArray(object)
   * @param {Any} object 要判断的变量名称
   *
   * @returns {Boolean} 判断结果
   */
  isArray: function (object) {
    return Object.prototype.toString.call(object) === '[object Array]';
  },
  /**
   * 判断一个变量是否数字类型
   * @name core.Object.isNumber
   * @function
   * @grammar core.Object.isNumber(object)
   * @param {Any} object 要判断的变量名称
   *
   * @returns {Boolean} 判断结果
   */
  isNumber: function (object) {
    return typeof object == 'number';
  },
  /**
   * 判断一个变量是否jQuery对象
   * @name core.Object.isJQuery
   * @function
   * @grammar core.Object.isJQuery(object)
   * @param {Any} object 要判断的变量名称
   *
   * @returns {Boolean} 判断结果
   */
  isJQuery: function (object) {
    return object instanceof window.jQuery;
  },
  /**
   * 扩展一个对象
   * @name core.Object.extend
   * @function
   * @grammar core.Object.extend(object,object1[, object2...,][,isDeep])
   * @param {Object} object 待扩展对象
   * @param {Object} objectN 被使用的对象列表，用于扩展第一个参数
   * @param {Boolean} isDeep 是否深度扩展
   * @example
   * //一个简单扩展的例子
   * var defaults = { url:"", method:"GET" };
   * var options = { url: "http://www.lietou.com" };
   * core.Object.extend(defaults, options);
   * ------------------------------------------
   * { url: "http://www.lietou.com", method:"GET" }
   * @example
   * //一个深度扩展的例子
   * var defaults = {
   *   url:"",
   *   method:"GET",
   *   data: {
   *     id: 123,
   *     name: "张三"
   *   }
   * };
   * var options = {
   *   url: "http://www.lietou.com",
   *   data: {
   *     id: 456
   *   }
   * };
   * core.Object.extend(defaults, options, true);
   * ------------------------------------------
   * {
   *   url:"http://www.lietou.com",
   *   method:"GET",
   *   data: {
   *     id: 456,
   *     name: "张三"
   *   }
   * }
   * @remark 该方法会修改源对象本身
   *
   * @returns {Boolean} 扩展后的对象
   */
  extend: function () {
    var result = arguments[0] || {}, length = arguments.length;
    for (var i = 1; i < length; i++) {
      if (typeof arguments[i] == 'object') {
        for (var key in arguments[i]) {
          if (arguments[length - 1] === true && arguments[i][key].constructor == Object) {
            core.Object.extend(result[key], arguments[i][key]);
          } else {
            result[key] = arguments[i][key];
          }
        }
      }
    }
    return result;
  },
  /**
   * 扩展参数列表，用于ajax请求中的参数传递
   * @name core.Object.extendParams
   * @function
   * @grammar core.Object.extendParams(array|object,object1[, object2...])
   * @param {Object} object 待扩展的对象或数组
   * @param {Object} objectN 被使用的对象列表，用于扩展第一个参数
   * @example
   * //扩展一个数组
   * var arr = [{ "name": "id", "value" : "123" }];
   * var options = { "name": "张三" };
   * core.Object.extendParams(arr, options);
   * ------------------------------------------
   * [{ "name": "id", "value" : "123" },{ "name": "name", "value" : "张三" }]
   * @example
   * //扩展一个对象
   * var arr = { "id": "123", "name" : "张三" };
   * var options = { "gender": "男" };
   * core.Object.extendParams(arr, options);
   * ------------------------------------------
   * { "id": "123", "name" : "张三", "gender": "男" }
   * @remark 该方法会修改源对象本身
   *
   * @returns {Boolean} 扩展后的对象或数组
   */
  extendParams: function () {
    var result = arguments[0];
    if (core.Object.isArray(result)) {
      for (var i = 1; i < arguments.length; i++) {
        if (typeof arguments[i] == 'object') {
          for (var key = 0; key < arguments[i].length; key++) {
            result.push({"name": key, "value": arguments[i][key]});
          }
        }
      }
    } else {
      for (var i = 1; i < arguments.length; i++) {
        if (typeof arguments[i] == 'object') core.Object.extend(result, arguments[i]);
      }
    }
    return result;
  },

  /**
   * 将对象或数组转化为URL Query字符串
   * @function
   * @name core.Object.toQueryString
   * @grammar core.Object.toQueryString(source[, keyname])
   * @param {Object|Array} source 需要转化的对象或数组
   * @param {String} [keyname] 当source为数组时，参数keyname用于替代数组的下标
   *
   * @returns {String} URL查询串
   */
  toQueryString: function (source, keyname) {
    var rt = [], t;
    for (var k in source) {
      t = source[k];
      if (core.Object.isFunction(t)) continue;
      if (core.Object.isObject(t)) {
        rt.push(core.Object.toQueryString(t, k));
      } else {
        if (/^\d+$/.test(k)) {
          rt.push(encodeURIComponent(keyname || k) + '=' + encodeURIComponent(t));
        } else {
          rt.push(encodeURIComponent(k) + '=' + encodeURIComponent(t));
        }
      }
    }
    return rt.join('&');
  }
};
